$.validator.addMethod(
  "regex",
  function(value, element, regexp) {
    var re = new RegExp(regexp);
    return this.optional(element) || re.test(value);
  },
  "O valor informnado é inválido."
);

//Adiciona o formato brasileiro de datas ao plugin jquery.validate
jQuery.validator.addMethod("dateBR", function(value, element) {
     //contando chars
    if (value.length == 0 || value == '__/__/____') return true;
    if(value.length!=10) return false;
    // verificando data
    var data        = value;
    var dia         = data.substr(0,2);
    var barra1      = data.substr(2,1);
    var mes         = data.substr(3,2);
    var barra2      = data.substr(5,1);
    var ano         = data.substr(6,4);
    if(data.length!=10||barra1!="/"||barra2!="/"||isNaN(dia)||isNaN(mes)||isNaN(ano)||dia>31||mes>12)return false;
    if((mes==4||mes==6||mes==9||mes==11) && dia==31)return false;
    if(mes==2 && (dia>29||(dia==29 && ano%4!=0)))return false;
    if(ano < 1900)return false;
    return true;
}, "Informe uma data válida");  // Mensagem padrão

//Adiciona validação de números de CPF com o plugin jquery.validate
$.validator.addMethod("cpf", function(value, element) {
   if (value.length == 0){
    return true
  }else{
    value = jQuery.trim(value);
    value = value.replace(/[\.-]/g,'');
    cpf = value
    while(cpf.length < 11) cpf = "0"+ cpf;
    var expReg = /^0+$|^1+$|^2+$|^3+$|^4+$|^5+$|^6+$|^7+$|^8+$|^9+$/;
    var a = [];
    var b = new Number;
    var c = 11;
    for (i=0; i<11; i++){
      a[i] = cpf.charAt(i);
      if (i < 9) b += (a[i] * --c);
    }
    if ((x = b % 11) < 2) { a[9] = 0 } else { a[9] = 11-x }
    b = 0;
    c = 11;
    for (y=0; y<10; y++) b += (a[y] * c--);
    if ((x = b % 11) < 2) { a[10] = 0; } else { a[10] = 11-x; }
     var retorno = true;
    if ((cpf.charAt(9) != a[9]) || (cpf.charAt(10) != a[10]) || cpf.match(expReg)) retorno = false;
    return this.optional(element) || retorno;
  }
}, "Informe um CPF válido."); // Mensagem padrão

//Adiciona validação de números de CNPJ com o plugin jquery.validate
$.validator.addMethod("cnpj", function(value, element) {
  value = $.trim(value);
  value = value.replace(/[\.\-\/]/g,'');
  cnpj = value
  while(cnpj.length < 14) cnpj = "0"+ cnpj;
  var cnpj_array = [];
  var peso = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
  var soma = new Number;
  var c = 11;
  
  for (i=0; i<12; i++){
    cnpj_array.push(cnpj.charAt(i));
    soma += (cnpj_array[i] * peso[(i+1)])
  }
  if ((soma % c) < 2){
    cnpj_array.push(0);
  }else{
    cnpj_array.push(11-(soma % c));
  }
  
  soma = 0
  for (i=0; i<13; i++){
    soma += (cnpj_array[i] * peso[(i)])
  }
  if ((soma % c) < 2){
    cnpj_array.push(0);
  }else{
    cnpj_array.push(11-(soma % c));
  }
  
  if ((cnpj_array.toString().replace(/,/g,'')) == cnpj){
    return true;
  }else{
    return false;
  }
}, "Informe um CNPJ válido."); // Mensagem padrão

//Adiciona validação de números de PIS/PASEP/NIT com o plugin jquery.validate
$.validator.addMethod("pisPasepNit", function(value, element){
  if (value.length == 0){
    return true
  }else{
    pis_pasep_nit = value;
    value = $.trim(value);
    value = value.replace(/[\.-]/g,'');
    while(pis_pasep_nit.length < 11) pis_pasep_nit = '0' + pis_pasep_nit;
    var expReg = /^0+$|^1+$|^2+$|^3+$|^4+$|^5+$|^6+$|^7+$|^8+$|^9+$/;
    var produtos = [];
    var pesos = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
    var soma = 0;
    var resultado = new Number;
    for (i=0; i<10; i++){
      produtos[i] = (pis_pasep_nit.charAt(i) * pesos[i]);
      soma = soma + produtos[i];
    }
    resultado = 11 - (soma % 11);
    if (resultado == 10 || resultado == 11) resultado = 0;
    if ((pis_pasep_nit.charAt(10) != resultado) || (pis_pasep_nit.match(expReg))){
      return false;
    }else{
      return true;
    }
  }
}, "Informe um PIS/PASEP/NIT válido."); //Mensagem padrão

//Valida se as datas informadas estão entre a data de nascimento e a data atual
$.validator.addMethod("dateInterval", function(value, element, params){
  var inicio, fim, valor;
  if (params[0] == '' || params[0] == '__/__/____'){
    inicio = Date.parse('01/01/1900');
  }else{
    inicio = Date.parse(params[0]);
  }

  if (params[1] == '' || params[1] == '__/__/____'){
    fim = Date.today()
  } else {
    fim = Date.parse(params[1])
  }

  valor = Date.parse(value)

  if (valor != null){
    return valor.between(inicio, fim);
  } else {
    return true;
  }
}, "A data deve estar entre a data de nascimento do titular e a data atual");

//Valida se a data informada está no futuro
$.validator.addMethod("futureDate", function(value,element){
  if (Date.compare(Date.parse(value), Date.today()) > 0){
    return false;
  }else{
    return true;
  }
}, "A data não pode estar no futuro")

//Valida se um campo do tipo select possui um valor válido selecionado
$.validator.addMethod('selectcheck', function (value) {
    return (value != 'selecione');
}, "Este campo é obrigatório");


// Validate for 2 decimal for money
jQuery.validator.addMethod("decimalTwo", function(value, element) {
  return this.optional(element) || /^\d{1,3}([.]\d{3})*(\,\d{2})$/.test(value);
}, "O campo deve estar no formato 999.999,99");